#include <iostream>
#include <string>
#include <errno.h>
#include <netinet/in.h>
#include <unistd.h>
// inet_pton函数所需头文件
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#define MAXLINE 4096

using namespace std;

int main(int argc, char **argv)
{
    int sockfd, n;
    char recvline[4096], sendline[4096];
    struct sockaddr_in servaddr;
    if (argc != 2)
    {
        cout << "usage: ./client <ipaddress>" << endl;
        return 0;
    }
    // 客户端创建socket
    if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0)
    {
        cout << "create socket error:" << strerror(errno) << "(errno:" << errno << ")" << endl;
        return 0;
    }
    memset(&servaddr, 0, sizeof(servaddr));
    servaddr.sin_family = AF_INET;
    servaddr.sin_port = htons(6666);
    // inet_pton函数将转换字符串到网络地址，第一个参数af转换后存在第三个参数中
    if (inet_pton(AF_INET, argv[1], &servaddr.sin_addr) <= 0)
    {
        cout << "inet_pton error for " << argv[1] << endl;
        return 0;
    }
    // 根据服务器ip地址和端口号试图连接服务器socket，建立与TCP服务器的连接
    // connect参数：(客户端的socket描述字，服务器的socket地址，socket地址的长度)
    if (connect(sockfd, (struct sockaddr *)&servaddr, sizeof(servaddr)) < 0)
    {
        cout << "connect error:" << strerror(errno) << "(errno:" << errno << ")" << endl;
        return 0;
    }
    cout << "send msg to server: " << endl;
    // 接收输入
    fgets(sendline, 4096, stdin);
    // send参数：(socket描述字，buff缓冲区，缓冲区长度)
    if (send(sockfd, sendline, strlen(sendline), 0) < 0)
    {
        cout << "send msg error:" << strerror(errno) << "(errno:" << errno << ")" << endl;
        return 0;
    }
    // 完成读写操作后关闭相应的socket描述字，需要包含头文件<unistd.h>
    close(sockfd);
    return 0;
}
